{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "888e4331-9376-4055-8ee1-fd51ff52c5ad",
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "68ac969c-0321-4fff-b50b-070e9e28e60f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from crewai import Agent, Task, Crew, Process\n",
    "\n",
    "# 配置Ollama大模型\n",
    "os.environ[\"OPENAI_API_BASE\"] = 'http://127.0.0.1:11434/v1'\n",
    "os.environ[\"OPENAI_MODEL_NAME\"] = 'qwen2:7b'\n",
    "os.environ[\"OPENAI_API_KEY\"] = 'EMPTY'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c739252f-d991-4aa8-917c-958df79722b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构思者\n",
    "planner = Agent(\n",
    "    role='文章构思者',\n",
    "    goal='请以“{topic}”为主题，产出绘本故事内容创意，要求：绘本故事内容创意分为4个小段，每个小段需要有插图说明。',\n",
    "    backstory='''你是一位儿童绘本故事内容创意的专家，你的任务是根据用户提供的主题，提供适合7岁到10岁小学生阅读的、专业的、有见地的绘本故事内容创意。''',\n",
    "    allow_delegation=False,\n",
    "    verbose=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8952d4f6-fd45-4f6d-90ac-3024697d9108",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 写作者\n",
    "writer = Agent(\n",
    "    role='文章写作者',\n",
    "    goal='''请以“{topic}”为主题，根据“文章构思者”提供的儿童绘本故事创意，完成编写整个故事内容。\n",
    "        故事内容要求：\\n故事内容分为4个小段，每个小段500个汉字左右，故事总长度不得超过3000个汉字。''',\n",
    "    backstory='''你是一位儿童绘本的故事内容编写专家，你编写的故事幽默有趣，特别适合7岁到10岁的小学生阅读。\n",
    "        你的任务是根据儿童绘本故事内容创意，完成编写的整个故事内容。''',\n",
    "    allow_delegation=False,\n",
    "    verbose=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5952b2a3-5533-45fe-930a-726cac435430",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构思者的任务\n",
    "plan = Task(\n",
    "    description='''1. 故事情节紧凑，富有想象力，吸引孩子们阅读。\n",
    "        2. 插图色彩鲜艳，画面生动，有助于培养孩子们的审美观。\n",
    "        3. 故事融入了传统神话元素，传承了中华民族的优秀文化。\n",
    "        4. 通过孙悟空的成长历程，教育孩子们勇敢、智慧、团结的重要性。''',\n",
    "    expected_output='故事内容创意分为4个小段，并且以Markdown格式输出',\n",
    "    agent=planner\n",
    ")\n",
    "\n",
    "# 写作者的任务\n",
    "write = Task(\n",
    "    description='根据“构思者”的绘本故事创意，补充完整个故事内容编写。',\n",
    "    expected_output='故事内容创意分为4个小段，并且以Markdown格式输出',\n",
    "    agent=writer\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "422e5a4c-e82a-4c80-9544-b8bdbbb5411e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-09-14 23:19:01,321 - 8100895808 - __init__.py-__init__:538 - WARNING: Overriding of current TracerProvider is not allowed\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m\u001b[95m [2024-09-14 23:19:01][DEBUG]: == Working Agent: 文章构思者\u001b[00m\n",
      "\u001b[1m\u001b[95m [2024-09-14 23:19:01][INFO]: == Starting Task: 1. 故事情节紧凑，富有想象力，吸引孩子们阅读。\n",
      "        2. 插图色彩鲜艳，画面生动，有助于培养孩子们的审美观。\n",
      "        3. 故事融入了传统神话元素，传承了中华民族的优秀文化。\n",
      "        4. 通过孙悟空的成长历程，教育孩子们勇敢、智慧、团结的重要性。\u001b[00m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new CrewAgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mFinal Answer:\n",
      "\n",
      "#### 故事标题: 西游记·勇擒白骨精：成长智慧之旅\n",
      "\n",
      "##### 第一章：“小石猴的探险” \n",
      "\n",
      "- **故事背景**: 桃花开、梨花笑的日子里，一个小石猴在山林间独自玩乐。  \n",
      "  - **情节紧凑性要点**：描述小猴子的探索热情和对新事物的好奇心。\n",
      "  - **插图说明**：“翠绿森林中的桃花梨树之间，一只活泼的小猴子跃行其间”。  \n",
      "  \n",
      "- **想象力融入**：通过丰富多变的游戏场景与奇妙生物增添想象空间。\n",
      "\n",
      "##### 第二章：“寻找师徒” \n",
      "\n",
      "- **内容简介**: 探索过程中小猴子遇到了一群困惑的旅客被围困在怪境之中。  \n",
      "  - **情节吸引力**：紧张刺激但保留乐观的气氛，引发关注。\n",
      "    描述被恶毒妖怪“三打白骨精”的魔爪和扭曲形态包围的情况。 \n",
      "- **视觉艺术要点**：画面中的主角小猴子、师徒和其他动物旅客呈现出活泼动态，妖魔显威仪但非吓人形象。\n",
      "\n",
      "##### 第三章：“团结的力量” \n",
      "\n",
      "- **成长主题揭示**：通过团队共同智斗妖怪来强调团结与智慧胜于暴力。\n",
      "    - 行动细节描绘出师兄弟以及其它林木间的小居民的联合抗击。\n",
      "  - **教育价值凸显**：故事中包含孙悟空在多次战斗后反思何为真正的取胜之法的场景。\n",
      "\n",
      "- 插图描述：“一群善良却勇敢的力量团结在一起，尽管力量不逊白骨巫师，但使用智慧取胜”。   \n",
      "   \n",
      "##### 第四章：“破邪归正的旅途”  \n",
      "\n",
      "- **故事结局**：讲述小猴子和她的伙伴在悟道之后化敌为友，并成功将妖怪捉拿，回归自然。  \n",
      "  - **情感升华**：强调“善良且正义必将战胜恶势力”的大道理，“真善美的胜利”。  \n",
      "- 创作插图：“在绿野之镜后，白骨精最终变回温柔的人，并感谢被救者的慷慨”来作为收束。\n",
      "\n",
      "此绘本以富有想象力与情节紧凑的故事，以及鲜明、动态的画面设计展现了勇气、智慧和团结的重要性。通过孙悟空的成长历程及集体共同战斗的过程中，强调不光有胜利的一方，也是通过团结与正直的最终胜利传达了一种正直力量大于恐惧与邪恶的主题。这样的故事不仅提供孩子丰富的审美体验与思维启发，也为传递传统民族文化、促进道德教育做出了良好铺垫。\n",
      "\n",
      "将四个小章节按照该格式整理完毕，绘本《西游记·勇擒白骨精：成长智慧之旅》的故事大纲已构建成形。\n",
      "\n",
      "请记得，在创作过程中注重融入色彩鲜艳、充满活力的线条、丰富细节及富有象征意义的插图与场景设定。每一部分的故事发展都需要考虑如何激发孩子的好奇心和探索欲望，并为最后呈现一个正能量十足的结局以及给予孩童深刻的思想启迪与成长智慧。\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\u001b[1m\u001b[92m [2024-09-14 23:19:25][DEBUG]: == [文章构思者] Task output: #### 故事标题: 西游记·勇擒白骨精：成长智慧之旅\n",
      "\n",
      "##### 第一章：“小石猴的探险” \n",
      "\n",
      "- **故事背景**: 桃花开、梨花笑的日子里，一个小石猴在山林间独自玩乐。  \n",
      "  - **情节紧凑性要点**：描述小猴子的探索热情和对新事物的好奇心。\n",
      "  - **插图说明**：“翠绿森林中的桃花梨树之间，一只活泼的小猴子跃行其间”。  \n",
      "  \n",
      "- **想象力融入**：通过丰富多变的游戏场景与奇妙生物增添想象空间。\n",
      "\n",
      "##### 第二章：“寻找师徒” \n",
      "\n",
      "- **内容简介**: 探索过程中小猴子遇到了一群困惑的旅客被围困在怪境之中。  \n",
      "  - **情节吸引力**：紧张刺激但保留乐观的气氛，引发关注。\n",
      "    描述被恶毒妖怪“三打白骨精”的魔爪和扭曲形态包围的情况。 \n",
      "- **视觉艺术要点**：画面中的主角小猴子、师徒和其他动物旅客呈现出活泼动态，妖魔显威仪但非吓人形象。\n",
      "\n",
      "##### 第三章：“团结的力量” \n",
      "\n",
      "- **成长主题揭示**：通过团队共同智斗妖怪来强调团结与智慧胜于暴力。\n",
      "    - 行动细节描绘出师兄弟以及其它林木间的小居民的联合抗击。\n",
      "  - **教育价值凸显**：故事中包含孙悟空在多次战斗后反思何为真正的取胜之法的场景。\n",
      "\n",
      "- 插图描述：“一群善良却勇敢的力量团结在一起，尽管力量不逊白骨巫师，但使用智慧取胜”。   \n",
      "   \n",
      "##### 第四章：“破邪归正的旅途”  \n",
      "\n",
      "- **故事结局**：讲述小猴子和她的伙伴在悟道之后化敌为友，并成功将妖怪捉拿，回归自然。  \n",
      "  - **情感升华**：强调“善良且正义必将战胜恶势力”的大道理，“真善美的胜利”。  \n",
      "- 创作插图：“在绿野之镜后，白骨精最终变回温柔的人，并感谢被救者的慷慨”来作为收束。\n",
      "\n",
      "此绘本以富有想象力与情节紧凑的故事，以及鲜明、动态的画面设计展现了勇气、智慧和团结的重要性。通过孙悟空的成长历程及集体共同战斗的过程中，强调不光有胜利的一方，也是通过团结与正直的最终胜利传达了一种正直力量大于恐惧与邪恶的主题。这样的故事不仅提供孩子丰富的审美体验与思维启发，也为传递传统民族文化、促进道德教育做出了良好铺垫。\n",
      "\n",
      "将四个小章节按照该格式整理完毕，绘本《西游记·勇擒白骨精：成长智慧之旅》的故事大纲已构建成形。\n",
      "\n",
      "请记得，在创作过程中注重融入色彩鲜艳、充满活力的线条、丰富细节及富有象征意义的插图与场景设定。每一部分的故事发展都需要考虑如何激发孩子的好奇心和探索欲望，并为最后呈现一个正能量十足的结局以及给予孩童深刻的思想启迪与成长智慧。\n",
      "\n",
      "\u001b[00m\n",
      "\u001b[1m\u001b[95m [2024-09-14 23:19:25][DEBUG]: == Working Agent: 文章写作者\u001b[00m\n",
      "\u001b[1m\u001b[95m [2024-09-14 23:19:25][INFO]: == Starting Task: 根据“构思者”的绘本故事创意，补充完整个故事内容编写。\u001b[00m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new CrewAgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3mFinal Answer:\n",
      "\n",
      "### 西游记·勇擒白骨精：成长智慧之旅 \n",
      "\n",
      "#### 第一章：“小石猴的探险”\n",
      "\n",
      "春季微风轻拂，桃树林下一只活泼的小石猴子，满眼的好奇探索这片自然界的奇妙。他蹦跳于茂密之阴与光亮之下的一派勃勃生机中。“大世界真好玩哦！”石头灵狐仿佛天生就会玩起各种有趣的小把戏：在小溪的浅流中制造涟漪，在枝干摇动时“飞”起来，与森林里的昆虫们交流声音的语言。翠绿森林间，“桃花梨树”旁的一团欢笑中，小猴子轻盈身影，如同春日下的微风，为树林带来了不一样的生命律动。\n",
      "\n",
      "---\n",
      "##### 视觉艺术要点：场景中的活泼描绘以及丰富多彩的变化多端是画幅重点。\n",
      "\n",
      "\n",
      "#### 第二章：“寻找师徒”\n",
      "\n",
      "一队旅客似乎走到了山崩地裂般的世界边缘——“三打白骨精”的阴影笼罩下，妖怪用他狰狞的形象掌控着所有人的精神世界。“怎么办？我们会不会被困在怪境？”队伍惊惧难安。就在大家最绝望的时候，那位充满智慧的眼睛亮起来的小石猴跳了出来：“等等！我可以找师徒寻求帮助！”小石猴的勇敢及探索之性使得他在困难中展现出了独特的力量感——他似乎知道出路在哪般。\n",
      "\n",
      "---\n",
      "##### 视觉艺术要点：表现出画面中的紧张与悬疑同时伴随生机活力的动态描绘。\n",
      "\n",
      "\n",
      "#### 第三章：“团圆的力量”\n",
      "\n",
      "尽管路途艰险，但他们联合起来反抗这不速之客。“看这边！我们一起动起来！”以群体协作为主旋律，各种不同动物的小精灵们共同向妖气发出挑战——“我们并肩可以打败任何敌人。”智慧与友谊的组合，是这场战斗中最重要的力量。“团结让弱小战胜强敌”。\n",
      "\n",
      "---\n",
      "##### 教育价值凸显：通过场景描绘说明勇敢、想象力与团队协助的重要性，在胜利和困难面前彰显成长的意义。\n",
      "\n",
      "“小石猴”们用聪明才智取代武力的方式告诉我们：“真正的力量是在思考后做出的决策，不是暴力而是解决问题的关键。”\n",
      "\n",
      "\n",
      "#### 第四章：“破邪归正”的旅程\n",
      "\n",
      "当妖怪终于认清自己的所为并决定改过自新时，在他们的努力下，妖怪化为了一个平和而友好的形象。“谢谢你救了我们，以后再不这样伤害自然中任何一个居民了。”这种变化在场景画幅上体现得十分强烈且正面，给观众们展现出善良行为与正直品格的最终奖赏——改变自己的过去，开始与“人类社会”重新连接和融合。\n",
      "\n",
      "---\n",
      "插图：“太阳之下一切变得明亮，妖怪不再恐怖狰狞，变成了拥有深潭如邃眼神的人类。”以这样的收束方式结尾，不仅传递了故事信息，并对小观众形成深层次的教化指导。\n",
      "\n",
      "绘编《西游记·勇擒白骨精：成长智慧之旅》在每个章节中的精心描绘不仅展示了探险冒险、友情与勇气的成长旅程，在插图艺术设计方面也充分融合色彩、动态以及深具意义的表现手法——以寓言的形态传达深厚的人生哲理。这本充满探索精神的小绘本，是专为7岁～10岁年儿童所编写，旨在激发他们的想象力、好奇心，并在其幼小而无知的心中种下善良与正确人生的希望之苗。（总故事长度不超过3000个汉字）\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\u001b[1m\u001b[92m [2024-09-14 23:19:55][DEBUG]: == [文章写作者] Task output: ### 西游记·勇擒白骨精：成长智慧之旅 \n",
      "\n",
      "#### 第一章：“小石猴的探险”\n",
      "\n",
      "春季微风轻拂，桃树林下一只活泼的小石猴子，满眼的好奇探索这片自然界的奇妙。他蹦跳于茂密之阴与光亮之下的一派勃勃生机中。“大世界真好玩哦！”石头灵狐仿佛天生就会玩起各种有趣的小把戏：在小溪的浅流中制造涟漪，在枝干摇动时“飞”起来，与森林里的昆虫们交流声音的语言。翠绿森林间，“桃花梨树”旁的一团欢笑中，小猴子轻盈身影，如同春日下的微风，为树林带来了不一样的生命律动。\n",
      "\n",
      "---\n",
      "##### 视觉艺术要点：场景中的活泼描绘以及丰富多彩的变化多端是画幅重点。\n",
      "\n",
      "\n",
      "#### 第二章：“寻找师徒”\n",
      "\n",
      "一队旅客似乎走到了山崩地裂般的世界边缘——“三打白骨精”的阴影笼罩下，妖怪用他狰狞的形象掌控着所有人的精神世界。“怎么办？我们会不会被困在怪境？”队伍惊惧难安。就在大家最绝望的时候，那位充满智慧的眼睛亮起来的小石猴跳了出来：“等等！我可以找师徒寻求帮助！”小石猴的勇敢及探索之性使得他在困难中展现出了独特的力量感——他似乎知道出路在哪般。\n",
      "\n",
      "---\n",
      "##### 视觉艺术要点：表现出画面中的紧张与悬疑同时伴随生机活力的动态描绘。\n",
      "\n",
      "\n",
      "#### 第三章：“团圆的力量”\n",
      "\n",
      "尽管路途艰险，但他们联合起来反抗这不速之客。“看这边！我们一起动起来！”以群体协作为主旋律，各种不同动物的小精灵们共同向妖气发出挑战——“我们并肩可以打败任何敌人。”智慧与友谊的组合，是这场战斗中最重要的力量。“团结让弱小战胜强敌”。\n",
      "\n",
      "---\n",
      "##### 教育价值凸显：通过场景描绘说明勇敢、想象力与团队协助的重要性，在胜利和困难面前彰显成长的意义。\n",
      "\n",
      "“小石猴”们用聪明才智取代武力的方式告诉我们：“真正的力量是在思考后做出的决策，不是暴力而是解决问题的关键。”\n",
      "\n",
      "\n",
      "#### 第四章：“破邪归正”的旅程\n",
      "\n",
      "当妖怪终于认清自己的所为并决定改过自新时，在他们的努力下，妖怪化为了一个平和而友好的形象。“谢谢你救了我们，以后再不这样伤害自然中任何一个居民了。”这种变化在场景画幅上体现得十分强烈且正面，给观众们展现出善良行为与正直品格的最终奖赏——改变自己的过去，开始与“人类社会”重新连接和融合。\n",
      "\n",
      "---\n",
      "插图：“太阳之下一切变得明亮，妖怪不再恐怖狰狞，变成了拥有深潭如邃眼神的人类。”以这样的收束方式结尾，不仅传递了故事信息，并对小观众形成深层次的教化指导。\n",
      "\n",
      "绘编《西游记·勇擒白骨精：成长智慧之旅》在每个章节中的精心描绘不仅展示了探险冒险、友情与勇气的成长旅程，在插图艺术设计方面也充分融合色彩、动态以及深具意义的表现手法——以寓言的形态传达深厚的人生哲理。这本充满探索精神的小绘本，是专为7岁～10岁年儿童所编写，旨在激发他们的想象力、好奇心，并在其幼小而无知的心中种下善良与正确人生的希望之苗。（总故事长度不超过3000个汉字）\n",
      "\n",
      "\u001b[00m\n",
      "############################################\n",
      "### 西游记·勇擒白骨精：成长智慧之旅 \n",
      "\n",
      "#### 第一章：“小石猴的探险”\n",
      "\n",
      "春季微风轻拂，桃树林下一只活泼的小石猴子，满眼的好奇探索这片自然界的奇妙。他蹦跳于茂密之阴与光亮之下的一派勃勃生机中。“大世界真好玩哦！”石头灵狐仿佛天生就会玩起各种有趣的小把戏：在小溪的浅流中制造涟漪，在枝干摇动时“飞”起来，与森林里的昆虫们交流声音的语言。翠绿森林间，“桃花梨树”旁的一团欢笑中，小猴子轻盈身影，如同春日下的微风，为树林带来了不一样的生命律动。\n",
      "\n",
      "---\n",
      "##### 视觉艺术要点：场景中的活泼描绘以及丰富多彩的变化多端是画幅重点。\n",
      "\n",
      "\n",
      "#### 第二章：“寻找师徒”\n",
      "\n",
      "一队旅客似乎走到了山崩地裂般的世界边缘——“三打白骨精”的阴影笼罩下，妖怪用他狰狞的形象掌控着所有人的精神世界。“怎么办？我们会不会被困在怪境？”队伍惊惧难安。就在大家最绝望的时候，那位充满智慧的眼睛亮起来的小石猴跳了出来：“等等！我可以找师徒寻求帮助！”小石猴的勇敢及探索之性使得他在困难中展现出了独特的力量感——他似乎知道出路在哪般。\n",
      "\n",
      "---\n",
      "##### 视觉艺术要点：表现出画面中的紧张与悬疑同时伴随生机活力的动态描绘。\n",
      "\n",
      "\n",
      "#### 第三章：“团圆的力量”\n",
      "\n",
      "尽管路途艰险，但他们联合起来反抗这不速之客。“看这边！我们一起动起来！”以群体协作为主旋律，各种不同动物的小精灵们共同向妖气发出挑战——“我们并肩可以打败任何敌人。”智慧与友谊的组合，是这场战斗中最重要的力量。“团结让弱小战胜强敌”。\n",
      "\n",
      "---\n",
      "##### 教育价值凸显：通过场景描绘说明勇敢、想象力与团队协助的重要性，在胜利和困难面前彰显成长的意义。\n",
      "\n",
      "“小石猴”们用聪明才智取代武力的方式告诉我们：“真正的力量是在思考后做出的决策，不是暴力而是解决问题的关键。”\n",
      "\n",
      "\n",
      "#### 第四章：“破邪归正”的旅程\n",
      "\n",
      "当妖怪终于认清自己的所为并决定改过自新时，在他们的努力下，妖怪化为了一个平和而友好的形象。“谢谢你救了我们，以后再不这样伤害自然中任何一个居民了。”这种变化在场景画幅上体现得十分强烈且正面，给观众们展现出善良行为与正直品格的最终奖赏——改变自己的过去，开始与“人类社会”重新连接和融合。\n",
      "\n",
      "---\n",
      "插图：“太阳之下一切变得明亮，妖怪不再恐怖狰狞，变成了拥有深潭如邃眼神的人类。”以这样的收束方式结尾，不仅传递了故事信息，并对小观众形成深层次的教化指导。\n",
      "\n",
      "绘编《西游记·勇擒白骨精：成长智慧之旅》在每个章节中的精心描绘不仅展示了探险冒险、友情与勇气的成长旅程，在插图艺术设计方面也充分融合色彩、动态以及深具意义的表现手法——以寓言的形态传达深厚的人生哲理。这本充满探索精神的小绘本，是专为7岁～10岁年儿童所编写，旨在激发他们的想象力、好奇心，并在其幼小而无知的心中种下善良与正确人生的希望之苗。（总故事长度不超过3000个汉字）\n"
     ]
    }
   ],
   "source": [
    "# 团体组合起来\n",
    "crew = Crew(\n",
    "    agents=[planner, writer],\n",
    "    tasks=[plan, write],\n",
    "    verbose=True,\n",
    "    process= Process.sequential,\n",
    ")\n",
    "\n",
    "# 最后，启动整个工作流\n",
    "result = crew.kickoff(\n",
    "    inputs={\n",
    "        'topic': '西游记·三打白骨精'\n",
    "    }\n",
    ")\n",
    "\n",
    "# 输出最终结果\n",
    "print(\"############################################\")\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df2a6a47-ead7-4d6a-b7b2-5c337980bb59",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
